#include "stm32f10x.h"                  // Device header

void Encode_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);			//开启TIM2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;				//GPIO是输入了，所以选择上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;		//GPIO_Pin_6和GPIO_Pin_7对应的TIM3的CH1和CH2
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);						//将PA0引脚初始化为上拉输入
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;		//时钟分频，选择不分频，此参数用于配置滤波器时钟，不影响时基单元功能，就是滤波器抖动干扰的频率，要在这个频率f内N个采样点全部是相同的频率，就证明抖动干扰消除了
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式，选择向上计数
	TIM_TimeBaseInitStruct.TIM_Period = 65535-1;					//计数周期，即ARR的值，就是重装的设定值，这里设定最大的，因为ARR计数不能越界
	TIM_TimeBaseInitStruct.TIM_Prescaler = 1-1;						//预分频器，即PSC的值，分频之后是 1MHz的标准频率，所以选择72分频
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;				//重复计数器，高级定时器才会用到
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);					//将结构体变量交给TIM_TimeBaseInit，TIM_TimeBaseInit配置TIM2的时基单元	
	
	/*输入捕获初始化*/
	TIM_ICInitTypeDef TIM_ICInitStruct;								//定义结构体变量
	TIM_ICStructInit(&TIM_ICInitStruct);							//结构体初始化，若结构体没有完整赋值
																	//则最好执行此函数，给结构体所有成员都赋一个默认值
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;					//输入捕获通道 TIM_Channel ，就是通道，选CH1
	TIM_ICInitStruct.TIM_ICFilter = 0xF;							//输入捕获Filt过滤器，0xF选择最大，过滤效果最好
	TIM_ICInit(TIM3,&TIM_ICInitStruct);	
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;					//输入捕获通道 TIM_Channe2 ，就是通道，选CH2
	TIM_ICInitStruct.TIM_ICFilter = 0xF;							//输入捕获Filt过滤器，0xF选择最大，过滤效果最好
	TIM_ICInit(TIM3,&TIM_ICInitStruct);		
	
	/*编码器接口配置*/
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
																	//配置编码器模式以及两个输入通道是否反相
																	//注意此时参数的Rising和Falling已经不代表上升沿和下降沿了，而是代表是否反相
																	//此函数必须在输入捕获初始化之后进行，否则输入捕获的配置会覆盖此函数的部分配置													
																	
	/*TIM使能*/
	TIM_Cmd(TIM3, ENABLE);			//使能TIM3，定时器开始运行
}

//获取编码器的位置
int16_t Encode_Get(void)
{
	return TIM_GetCounter(TIM3);
}

//获取编码器的速度
int16_t Encode_GetSpeed(void)
{
	int16_t tmp = 0;
	tmp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3,0);
	return tmp;
}

